class RedBall:
    def __init__(self, red_num_tuple):
        self.red_num_tuple = red_num_tuple  # 红球号码元组
        self.before_red_num_sum = sum(red_num_tuple)  # 本期红球号码和值
        self.next_red_num_set = set()  # 预测的下期红球集合

    # 求尾数的方法
    def get_tail_num(self, sum, num):
        """
        根据本期红球和值,计算红球号码的尾数
        尾数=(和值-红球号码)/红球号码 取整
        :param sum: 本期所有红球号码和值
        :param num: 红球号码
        :return: 尾数
        """
        result = int((sum - num) / num)
        result = str(result)[-1:]
        result = int(result)
        return result

    # 通过尾数组合数据的方法
    def add_tail_num_set(self, tail_num):
        """
        通过尾数,组合数据.在尾数前面加1和2,如果尾数小于3,可以在前面加3
        :param tail_num: 尾数
        """
        self.next_red_num_set.add(tail_num)
        self.next_red_num_set.add(int('1' + str(tail_num)))
        self.next_red_num_set.add(int('2' + str(tail_num)))
        if tail_num < 3:
            self.next_red_num_set.add(int('3' + str(tail_num)))

    # 得到下期预测红球集合的方法
    def get_next_red_num_set_by_red_sum_method(self):
        """
        计算下期的红球号码的预测集合(和值预测法)
        """
        for i in self.red_num_tuple:
            # 获取尾数
            tail_num = self.get_tail_num(self.before_red_num_sum, i)
            if tail_num != 0:
                # 组合数据
                self.add_tail_num_set(tail_num)
        return self.next_red_num_set

    def get_next_red_num_set(self):
        """
        获取下一期红球可能出现的号码数集合
        :return:号码集合
        """
        return self.get_next_red_num_set_by_red_sum_method()

    def __str__(self):
        return "红球类: " + str(self.red_num_tuple)


if __name__ == '__main__':
    red = RedBall((4, 7, 19, 21, 25, 31))
    print(red.get_next_red_num_set_by_red_sum_method())
